﻿using Microsoft.AspNetCore.Mvc;
using System.Text;
using ZKTEcoPush.Models;
using ZKTEcoPush.Services;

namespace ZKTEcoPush.Controllers
{
    [Route("iclock")]
    [ApiController]
    public class PushController : ControllerBase
    {
        private readonly ILogger<PushController> _logger;
        private IPushService _commandService;

        public PushController(ILogger<PushController> logger, IPushService commandService)
        {
            _logger = logger;
            _commandService = commandService;
        }

        /// <summary>
        /// 用于与服务器保持心跳。当处理大数据上传时，用ping保持心跳，大数据处理完，用getrequest保持心跳
        /// </summary>
        /// <param name="serialNumber"></param>
        /// <returns></returns>
        [HttpGet]
        [Route("ping", Name = nameof(Ping))]
        public string Ping([FromQuery] SerialNumber serialNumber)
        {
            _logger.LogInformation($"Ping: SN: {serialNumber.SN}");
            return $"OK";
        }

        /// <summary>
        /// 该功能复用[获取命令](#downloadcmd)请求，在其URL上加入参数，主要上传客户端的固件版本号、
        /// 登记用户数、登记指纹数、考勤记录数、设备IP地址、指纹算法版本、人脸算法版本、注册人脸所需
        /// 人脸个数、登记人脸数、设备支持功能标示信息
        /// </summary>
        /// <param name="serialNumber"></param>
        /// <returns></returns>
        [HttpGet]
        [Route("getrequest", Name = nameof(GetRequest))]
        public string GetRequest([FromQuery] SerialNumber serialNumber)
        {
            var cmd = _commandService.GetCommands();
            return cmd;
        }

        /// <summary>
        /// 初始化信息交互
        /// </summary>
        /// <param name="device"></param>
        /// <returns></returns>
        [HttpGet]
        [Route("cdata", Name = nameof(Cdata))]
        public string Cdata([FromQuery] DeviceInitial device)
        {
            var sb = new StringBuilder();
            sb.AppendLine($"GET OPTION FROM: {device.SN}");

            sb.AppendLine("ATTLOGStamp=1"); // 考勤记录
            sb.AppendLine("OPERLOGStamp=1"); // 操作日志
            sb.AppendLine("BIODATAStamp=1"); // 一体化模板
            sb.AppendLine("ATTPHOTOStamp=1"); // 考勤照片
            sb.AppendLine($"ErrorDelay={100}");// 断网重连
            sb.AppendLine($"Delay={10}");// 心跳间隔
            sb.AppendLine($"TransFlag={1000_0000_0000}");// 客户端向服务器自动上传哪些数据的标识
            sb.AppendLine("TimeZone=8");// 时区
            sb.AppendLine("Realtime=1");// 实时上传 为1表示有新数据就传送到服务器
            sb.AppendLine("Encrypt=0");// 是否加密传送数据标识，支持通信加密的场合，该参数需设置为1。


            // 服务器支持的协议版本号及时间（时间格式待定），新开发的服务器必须设置为 2.2.14 以上。
            sb.AppendLine("ServerVer=2.2.14");

            // 服务端依据哪个协议版本开发
            sb.AppendLine("PushProtVer=2.4.1");
            sb.AppendLine("SupportPing=1");  //ping接口参数
            return sb.ToString();
        }

        /*${Pin}${HT}${Time}${HT}${Status}${HT}${Verify}${HT}${Workcode}${HT}${Reserved1}${HT}${Rese
rved2}${HT}${IDNum}${HT}${Type}
IDNum：身份证号
Type：记录类型（0表示考勤，1表示核验）
Type值为0，考勤记录的内容为按照考勤协议定义。
Type值为1，
STATUS:0-成功，1-失败，2-黑名单
VERIFY
:1-人脸，2-人脸+指纹，3-指纹+人脸*/

        /// <summary>
        /// 上传考勤记录
        /// </summary>
        /// <param name="device"></param>
        /// <returns></returns>
        [HttpPost]
        [Route("cdata", Name = nameof(CdataPostAsync))]
        public async Task<string> CdataPostAsync([FromQuery] AttendanceQuery attendanceQuery)
        {
            var body = string.Empty;
            if (attendanceQuery.Table == "ATTLOG")
            {
                _logger.LogInformation("收到考勤信息");
                using (var reader = new StreamReader(Request.Body, Encoding.UTF8))
                {
                    body = await reader.ReadToEndAsync();
                }
                _logger.LogInformation($"考勤信息内容:[{body}]");

                // TODO: 实现人脸考勤数据识别并上报
                var recordList = ParseDataRecord(body);

                _commandService.PushDataRecords(recordList);

                return $"OK:{recordList.Count}";
            }
            return $"OK:{0}";
        }

        // 测试接口
        [HttpGet]
        [Route("test", Name = nameof(Test))]
        public ActionResult<DeviceInitial> Test([FromQuery] DeviceInitial device)
        {
            return Ok(device);
        }

        private List<AttendanceDataRecord> ParseDataRecord(string rawData)
        {
            // 简单示例：将每一行解析成一个对象
            var lines = rawData.Split('\n', StringSplitOptions.RemoveEmptyEntries);
            var result = new List<AttendanceDataRecord>();

            foreach (var line in lines)
            {
                var parts = line.Split(' ', StringSplitOptions.RemoveEmptyEntries);
                if (parts.Length >= 7)
                {
                    result.Add(new AttendanceDataRecord()
                    {
                        Id = parts[0],
                        Timestamp = DateTime.Parse($"{parts[1]} {parts[2]}"),
                        Value1 = parts[3],
                        Value2 = parts[4],
                        Value3 = parts[5],
                        Value4 = parts[6]
                    });
                }
            }

            return result;
        }
    }
}
